package com.tofacebook.spring.jdbc.mapper;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

/**
 * 改接口是持久层，提供一些方法，来操作数据库，执行sql语句
 */
@Repository
public interface BookMapper {
    /**
     * 根据书的id获取价格
     * @param bookId
     * @return
     * @Select  他底层是调用的SqlSession 去执行sql语句，
     * 我们需要在spring config配置文件注入对应的实现类，
     * 由IOC容器帮我们都找对应的实现类的实例
     * SqlSession.select(全路径的BookMapper调用getPriceByBookId()去执行sql语句)
     * SqlSession.select("com.tofacebook.spring.jdbc.mapper.BookMapper.getPriceByBookId(参数列表)")
     * 拿到对应的sql语句并将参数拼接到sql中去mysql服务里面执行
     */
    @Select("select price from t_book where book_id = #{bookId}")
    Integer getPriceByBookId(@Param("bookId") Integer bookId);

    /**
     * 根据书的id 更新库存
     * @param bookId
     */
    @Update("update t_book set stock = stock - #{buyNum} where book_id=#{bookId}")
    Integer updateStock(@Param("bookId") Integer bookId,@Param("buyNum") int buyNum);

    /**
     * 根据书id和价格去更新用户的余额
     * @param userId
     * @param price
     *
     * 如果说传递多个参数，并没有@Param
     * 那么mybatis就会将参数存入到map集合里面
     * 第一个参数：map.put("arg0",value)
     *          map.put("param1",value)
     *第二个参数：map.put("arg1",value)
     *         map.put("param2",value)
     *
     * 当我们使用了@Param("userId")
     * 那么mybatis就会将参数存入到map集合里面
     *        map.put("userId",value)
     *        map.put("param1",value)
     */
    @Update("update t_user set balance = balance - #{price} where user_id= #{userId}")
    Integer updateBalance(@Param("userId") Integer userId, @Param("price") Integer price);

    /**
     * 构造SqlSession接口实现类 叫：SqlSessionFactoryBean
     *
     * 方式1：可以再配置类中定义
     * 方式2：可以在spring config.xml文件中配置对应的SqlSessionFactoryBean实例
     */
}
